package images

import (
	"github.com/gin-gonic/gin"
	"image"
	"image/color"
	"image/gif"
	"io"
	"math"
	"math/rand"
)

//var palette = []color.Color{color.White, color.Black}

var palette = []color.Color{color.RGBA{255, 255, 255, math.MaxUint8}, color.Black, color.RGBA{0, 0, 128, math.MaxUint8}, color.RGBA{30, 144, 255, math.MaxUint8}, color.RGBA{72, 61, 139, math.MaxUint8}, color.RGBA{255, 0, 255, math.MaxUint8}, color.RGBA{124, 252, 0, math.MaxUint8}}

const (
	whiteIndex = 0
	blackIndex = 1
	greenIndex = 2
)

func ImageGif(c *gin.Context) {
	lissajous(c.Writer)
}

func lissajous(out io.Writer) {
	const (
		cycles  = 5     //完整x振荡器转数
		res     = 0.001 //角分辨力
		size    = 100   //图像画布封面[-size..+size]
		nframes = 128   //动画帧数
		delay   = 8     //以10ms为单位的帧间延迟
	)
	freq := rand.Float64() * 3.0 //
	anim := gif.GIF{LoopCount: nframes}
	phase := 0.0 // phase difference
	for i, c := 0, 1; i < nframes; i++ {
		rect := image.Rect(0, 0, 2*size+1, 2*size+1)
		img := image.NewPaletted(rect, palette)
		for t := 0.0; t < cycles*2*math.Pi; t += res {
			x := math.Sin(t)
			y := math.Sin(t*freq + phase)
			img.SetColorIndex(size+int(x*size+0.5), size+int(y*size+0.5),
				uint8(c))
		}
		c++ //修改颜色选择
		if c >= len(palette) {
			c = 1
		}
		phase += 0.1
		anim.Delay = append(anim.Delay, delay)
		anim.Image = append(anim.Image, img)
	}
	gif.EncodeAll(out, &anim) // NOTE: ignoring encoding errors
}
